﻿/*
 Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
 For licensing, see LICENSE.html or http://ckeditor.com/license
 */

(function () {
    var a;

    function b(i) {
        return i.type == CKEDITOR.NODE_TEXT && i.getLength() > 0 && (!a || !i.isReadOnly());
    };
    function c(i) {
        return !(i.type == CKEDITOR.NODE_ELEMENT && i.isBlockBoundary(CKEDITOR.tools.extend({}, CKEDITOR.dtd.$empty, CKEDITOR.dtd.$nonEditable)));
    };
    var d = function () {
        var i = this;
        return {
            textNode: i.textNode,
            offset: i.offset,
            character: i.textNode ? i.textNode.getText().charAt(i.offset) : null,
            hitMatchBoundary: i._.matchBoundary
        };
    }, e = ['find', 'replace'], f = [['txtFindFind', 'txtFindReplace'], ['txtFindCaseChk', 'txtReplaceCaseChk'], ['txtFindWordChk', 'txtReplaceWordChk'], ['txtFindCyclic', 'txtReplaceCyclic']];

    function g(i) {
        var j, k, l, m;
        j = i === 'find' ? 1 : 0;
        k = 1 - j;
        var n, o = f.length;
        for (n = 0; n < o; n++) {
            l = this.getContentElement(e[j], f[n][j]);
            m = this.getContentElement(e[k], f[n][k]);
            m.setValue(l.getValue());
        }
    };
    var h = function (i, j) {
        var k = new CKEDITOR.style(CKEDITOR.tools.extend({
            attributes: {'data-cke-highlight': 1},
            fullMatch: 1,
            ignoreReadonly: 1,
            childRule: function () {
                return 0;
            }
        }, i.config.find_highlight, true)), l = function (y, z) {
            var A = this, B = new CKEDITOR.dom.walker(y);
            B.guard = z ? c : function (C) {
                !c(C) && (A._.matchBoundary = true);
            };
            B.evaluator = b;
            B.breakOnFalse = 1;
            if (y.startContainer.type == CKEDITOR.NODE_TEXT) {
                this.textNode = y.startContainer;
                this.offset = y.startOffset - 1;
            }
            this._ = {matchWord: z, walker: B, matchBoundary: false};
        };
        l.prototype = {
            next: function () {
                return this.move();
            }, back: function () {
                return this.move(true);
            }, move: function (y) {
                var A = this;
                var z = A.textNode;
                if (z === null)return d.call(A);
                A._.matchBoundary = false;
                if (z && y && A.offset > 0) {
                    A.offset--;
                    return d.call(A);
                } else if (z && A.offset < z.getLength() - 1) {
                    A.offset++;
                    return d.call(A);
                } else {
                    z = null;
                    while (!z) {
                        z = A._.walker[y ? 'previous' : 'next'].call(A._.walker);
                        if (A._.matchWord && !z || A._.walker._.end)break;
                    }
                    A.textNode = z;
                    if (z)A.offset = y ? z.getLength() - 1 : 0; else A.offset = 0;
                }
                return d.call(A);
            }
        };
        var m = function (y, z) {
            this._ = {walker: y, cursors: [], rangeLength: z, highlightRange: null, isMatched: 0};
        };
        m.prototype = {
            toDomRange: function () {
                var y = new CKEDITOR.dom.range(i.document), z = this._.cursors;
                if (z.length < 1) {
                    var A = this._.walker.textNode;
                    if (A)y.setStartAfter(A); else return null;
                } else {
                    var B = z[0], C = z[z.length - 1];
                    y.setStart(B.textNode, B.offset);
                    y.setEnd(C.textNode, C.offset + 1);
                }
                return y;
            }, updateFromDomRange: function (y) {
                var B = this;
                var z, A = new l(y);
                B._.cursors = [];
                do {
                    z = A.next();
                    if (z.character)B._.cursors.push(z);
                } while (z.character);
                B._.rangeLength = B._.cursors.length;
            }, setMatched: function () {
                this._.isMatched = true;
            }, clearMatched: function () {
                this._.isMatched = false;
            }, isMatched: function () {
                return this._.isMatched;
            }, highlight: function () {
                var B = this;
                if (B._.cursors.length < 1)return;
                if (B._.highlightRange)B.removeHighlight();
                var y = B.toDomRange(), z = y.createBookmark();
                k.applyToRange(y);
                y.moveToBookmark(z);
                B._.highlightRange = y;
                var A = y.startContainer;
                if (A.type != CKEDITOR.NODE_ELEMENT)A = A.getParent();
                A.scrollIntoView();
                B.updateFromDomRange(y);
            }, removeHighlight: function () {
                var z = this;
                if (!z._.highlightRange)return;
                var y = z._.highlightRange.createBookmark();
                k.removeFromRange(z._.highlightRange);
                z._.highlightRange.moveToBookmark(y);
                z.updateFromDomRange(z._.highlightRange);
                z._.highlightRange = null;
            }, isReadOnly: function () {
                if (!this._.highlightRange)return 0;
                return this._.highlightRange.startContainer.isReadOnly();
            }, moveBack: function () {
                var A = this;
                var y = A._.walker.back(), z = A._.cursors;
                if (y.hitMatchBoundary)A._.cursors = z = [];
                z.unshift(y);
                if (z.length > A._.rangeLength)z.pop();
                return y;
            }, moveNext: function () {
                var A = this;
                var y = A._.walker.next(), z = A._.cursors;
                if (y.hitMatchBoundary)A._.cursors = z = [];
                z.push(y);
                if (z.length > A._.rangeLength)z.shift();
                return y;
            }, getEndCharacter: function () {
                var y = this._.cursors;
                if (y.length < 1)return null;
                return y[y.length - 1].character;
            }, getNextCharacterRange: function (y) {
                var z, A, B = this._.cursors;
                if ((z = B[B.length - 1]) && z.textNode)A = new l(n(z)); else A = this._.walker;
                return new m(A, y);
            }, getCursors: function () {
                return this._.cursors;
            }
        };
        function n(y, z) {
            var A = new CKEDITOR.dom.range();
            A.setStart(y.textNode, z ? y.offset : y.offset + 1);
            A.setEndAt(i.document.getBody(), CKEDITOR.POSITION_BEFORE_END);
            return A;
        };
        function o(y) {
            var z = new CKEDITOR.dom.range();
            z.setStartAt(i.document.getBody(), CKEDITOR.POSITION_AFTER_START);
            z.setEnd(y.textNode, y.offset);
            return z;
        };
        var p = 0, q = 1, r = 2, s = function (y, z) {
            var A = [-1];
            if (z)y = y.toLowerCase();
            for (var B = 0; B < y.length; B++) {
                A.push(A[B] + 1);
                while (A[B + 1] > 0 && y.charAt(B) != y.charAt(A[B + 1] - 1))A[B + 1] = A[A[B + 1] - 1] + 1;
            }
            this._ = {overlap: A, state: 0, ignoreCase: !!z, pattern: y};
        };
        s.prototype = {
            feedCharacter: function (y) {
                var z = this;
                if (z._.ignoreCase)y = y.toLowerCase();
                for (; ;) {
                    if (y == z._.pattern.charAt(z._.state)) {
                        z._.state++;
                        if (z._.state == z._.pattern.length) {
                            z._.state = 0;
                            return r;
                        }
                        return q;
                    } else if (!z._.state)return p; else z._.state = z._.overlap[z._.state];
                }
                return null;
            }, reset: function () {
                this._.state = 0;
            }
        };
        var t = /[.,"'?!;: \u0085\u00a0\u1680\u280e\u2028\u2029\u202f\u205f\u3000]/, u = function (y) {
            if (!y)return true;
            var z = y.charCodeAt(0);
            return z >= 9 && z <= 13 || z >= 8192 && z <= 8202 || t.test(y);
        }, v = {
            searchRange: null, matchRange: null, find: function (y, z, A, B, C, D) {
                var O = this;
                if (!O.matchRange)O.matchRange = new m(new l(O.searchRange), y.length);
                else {
                    O.matchRange.removeHighlight();
                    O.matchRange = O.matchRange.getNextCharacterRange(y.length);
                }
                var E = new s(y, !z), F = p, G = '%';
                while (G !== null) {
                    O.matchRange.moveNext();
                    while (G = O.matchRange.getEndCharacter()) {
                        F = E.feedCharacter(G);
                        if (F == r)break;
                        if (O.matchRange.moveNext().hitMatchBoundary)E.reset();
                    }
                    if (F == r) {
                        if (A) {
                            var H = O.matchRange.getCursors(), I = H[H.length - 1], J = H[0], K = o(J), L = n(I);
                            K.trim();
                            L.trim();
                            var M = new l(K, true), N = new l(L, true);
                            if (!(u(M.back().character) && u(N.next().character)))continue;
                        }
                        O.matchRange.setMatched();
                        if (C !== false)O.matchRange.highlight();
                        return true;
                    }
                }
                O.matchRange.clearMatched();
                O.matchRange.removeHighlight();
                if (B && !D) {
                    O.searchRange = w(1);
                    O.matchRange = null;
                    return arguments.callee.apply(O, Array.prototype.slice.call(arguments).concat([true]));
                }
                return false;
            }, replaceCounter: 0, replace: function (y, z, A, B, C, D, E) {
                var J = this;
                a = 1;
                var F = 0;
                if (J.matchRange && J.matchRange.isMatched() && !J.matchRange._.isReplaced && !J.matchRange.isReadOnly()) {
                    J.matchRange.removeHighlight();
                    var G = J.matchRange.toDomRange(), H = i.document.createText(A);
                    if (!E) {
                        var I = i.getSelection();
                        I.selectRanges([G]);
                        i.fire('saveSnapshot');
                    }
                    G.deleteContents();
                    G.insertNode(H);
                    if (!E) {
                        I.selectRanges([G]);
                        i.fire('saveSnapshot');
                    }
                    J.matchRange.updateFromDomRange(G);
                    if (!E)J.matchRange.highlight();
                    J.matchRange._.isReplaced = true;
                    J.replaceCounter++;
                    F = 1;
                } else F = J.find(z, B, C, D, !E);
                a = 0;
                return F;
            }
        };

        function w(y) {
            var z, A = i.getSelection(), B = i.document.getBody();
            if (A && !y) {
                z = A.getRanges()[0].clone();
                z.collapse(true);
            } else {
                z = new CKEDITOR.dom.range();
                z.setStartAt(B, CKEDITOR.POSITION_AFTER_START);
            }
            z.setEndAt(B, CKEDITOR.POSITION_BEFORE_END);
            return z;
        };
        var x = i.lang.findAndReplace;
        return {
            title: x.title,
            resizable: CKEDITOR.DIALOG_RESIZE_NONE,
            minWidth: 350,
            minHeight: 170,
            buttons: [CKEDITOR.dialog.cancelButton],
            contents: [{
                id: 'find',
                label: x.find,
                title: x.find,
                accessKey: '',
                elements: [{
                    type: 'hbox',
                    widths: ['230px', '90px'],
                    children: [{
                        type: 'text',
                        id: 'txtFindFind',
                        label: x.findWhat,
                        isChanged: false,
                        labelLayout: 'horizontal',
                        accessKey: 'F'
                    }, {
                        type: 'button',
                        id: 'btnFind',
                        align: 'left',
                        style: 'width:100%',
                        label: x.find,
                        onClick: function () {
                            var y = this.getDialog();
                            if (!v.find(y.getValueOf('find', 'txtFindFind'), y.getValueOf('find', 'txtFindCaseChk'), y.getValueOf('find', 'txtFindWordChk'), y.getValueOf('find', 'txtFindCyclic')))alert(x.notFoundMsg);
                        }
                    }]
                }, {
                    type: 'fieldset',
                    label: CKEDITOR.tools.htmlEncode(x.findOptions),
                    style: 'margin-top:29px',
                    children: [{
                        type: 'vbox',
                        padding: 0,
                        children: [{
                            type: 'checkbox',
                            id: 'txtFindCaseChk',
                            isChanged: false,
                            label: x.matchCase
                        }, {
                            type: 'checkbox',
                            id: 'txtFindWordChk',
                            isChanged: false,
                            label: x.matchWord
                        }, {
                            type: 'checkbox',
                            id: 'txtFindCyclic',
                            isChanged: false,
                            'default': true,
                            label: x.matchCyclic
                        }]
                    }]
                }]
            }, {
                id: 'replace', label: x.replace, accessKey: 'M', elements: [{
                    type: 'hbox',
                    widths: ['230px', '90px'],
                    children: [{
                        type: 'text',
                        id: 'txtFindReplace',
                        label: x.findWhat,
                        isChanged: false,
                        labelLayout: 'horizontal',
                        accessKey: 'F'
                    }, {
                        type: 'button',
                        id: 'btnFindReplace',
                        align: 'left',
                        style: 'width:100%',
                        label: x.replace,
                        onClick: function () {
                            var y = this.getDialog();
                            if (!v.replace(y, y.getValueOf('replace', 'txtFindReplace'), y.getValueOf('replace', 'txtReplace'), y.getValueOf('replace', 'txtReplaceCaseChk'), y.getValueOf('replace', 'txtReplaceWordChk'), y.getValueOf('replace', 'txtReplaceCyclic')))alert(x.notFoundMsg);
                        }
                    }]
                }, {
                    type: 'hbox',
                    widths: ['230px', '90px'],
                    children: [{
                        type: 'text',
                        id: 'txtReplace',
                        label: x.replaceWith,
                        isChanged: false,
                        labelLayout: 'horizontal',
                        accessKey: 'R'
                    }, {
                        type: 'button',
                        id: 'btnReplaceAll',
                        align: 'left',
                        style: 'width:100%',
                        label: x.replaceAll,
                        isChanged: false,
                        onClick: function () {
                            var y = this.getDialog(), z;
                            v.replaceCounter = 0;
                            v.searchRange = w(1);
                            if (v.matchRange) {
                                v.matchRange.removeHighlight();
                                v.matchRange = null;
                            }
                            i.fire('saveSnapshot');
                            while (v.replace(y, y.getValueOf('replace', 'txtFindReplace'), y.getValueOf('replace', 'txtReplace'), y.getValueOf('replace', 'txtReplaceCaseChk'), y.getValueOf('replace', 'txtReplaceWordChk'), false, true)) {
                            }
                            if (v.replaceCounter) {
                                alert(x.replaceSuccessMsg.replace(/%1/, v.replaceCounter));
                                i.fire('saveSnapshot');
                            } else alert(x.notFoundMsg);
                        }
                    }]
                }, {
                    type: 'fieldset',
                    label: CKEDITOR.tools.htmlEncode(x.findOptions),
                    children: [{
                        type: 'vbox',
                        padding: 0,
                        children: [{
                            type: 'checkbox',
                            id: 'txtReplaceCaseChk',
                            isChanged: false,
                            label: x.matchCase
                        }, {
                            type: 'checkbox',
                            id: 'txtReplaceWordChk',
                            isChanged: false,
                            label: x.matchWord
                        }, {
                            type: 'checkbox',
                            id: 'txtReplaceCyclic',
                            isChanged: false,
                            'default': true,
                            label: x.matchCyclic
                        }]
                    }]
                }]
            }],
            onLoad: function () {
                var y = this, z, A, B = 0;
                this.on('hide', function () {
                    B = 0;
                });
                this.on('show', function () {
                    B = 1;
                });
                this.selectPage = CKEDITOR.tools.override(this.selectPage, function (C) {
                    return function (D) {
                        C.call(y, D);
                        var E = y._.tabs[D], F, G, H;
                        G = D === 'find' ? 'txtFindFind' : 'txtFindReplace';
                        H = D === 'find' ? 'txtFindWordChk' : 'txtReplaceWordChk';
                        z = y.getContentElement(D, G);
                        A = y.getContentElement(D, H);
                        if (!E.initialized) {
                            F = CKEDITOR.document.getById(z._.inputId);
                            E.initialized = true;
                        }
                        if (B)g.call(this, D);
                    };
                });
            },
            onShow: function () {
                var B = this;
                v.searchRange = w();
                var y = B.getParentEditor().getSelection().getSelectedText(), z = j == 'find' ? 'txtFindFind' : 'txtFindReplace', A = B.getContentElement(j, z);
                A.setValue(y);
                A.select();
                B.selectPage(j);
                B[(j == 'find' && B._.editor.readOnly ? 'hide' : 'show') + 'Page']('replace');
            },
            onHide: function () {
                var y;
                if (v.matchRange && v.matchRange.isMatched()) {
                    v.matchRange.removeHighlight();
                    i.focus();
                    y = v.matchRange.toDomRange();
                    if (y)i.getSelection().selectRanges([y]);
                }
                delete v.matchRange;
            },
            onFocus: function () {
                if (j == 'replace')return this.getContentElement('replace', 'txtFindReplace'); else return this.getContentElement('find', 'txtFindFind');
            }
        };
    };
    CKEDITOR.dialog.add('find', function (i) {
        return h(i, 'find');
    });
    CKEDITOR.dialog.add('replace', function (i) {
        return h(i, 'replace');
    });
})();
